C#.NStar (Alpha RC) 0.9
Привет, неизвестный путник! Здесь вы можете
просмотреть информацию о C#.NStar (Alpha RC) 0.9. Вы можете скачать
EXE или просмотреть список изменений, скриншоты и/или видео.
Что уже проверено и работает в
дополнение к версии Pre-Pre-I-4:
1. Работа с файлами.
2. При техническом крахе сохраняется лог во временную папку.
3. Потоки. Причем нет этого ужасного разбиения на две воюющих стороны - синхронные и асинхронные - переключение контекста
происходит автоматически.
4. "Швейцарский нож" (оператор is, сопоставление шаблонов). Пока что реализованы семь шаблонов: константа, тип,
тип с объявлением переменной, var с объявлением переменной, шаблон сравнения (больше/меньше), пустой шаблон (_)
и составной шаблон - несколько шаблонов, объединенных операторами and, or, not.
Есть одна замеченная, но не исправленная ошибка, что попытка применить шаблон сравнения не к числу
вызывает технический крах. Возможно, в будущем исправлю.
5. Сокращенный оператор for - можно написать так:
for (i in collection)
{
...
}
- или так:
for (i in a..b)
{
...
}
6. Сокращенные константы - если есть ключевое слово const, необзательно писать var или тем более полный тип.
7. Записи (Record - с прописной буквы). В отличие от C#.NET, это по терминологии Мартина чистые структуры данных,
имеющие свойства, совпадащие по именам и типам с параметрами, конструктор из эих параметров и стандартные методы
Equals и GetHashCode и неспособные иметь другие методы и свойства.
8. Структуры (Struct - с прописной буквы).
9. Прототип полиморфизма в виде словарей от рекурсивного типа к классу, одним из следующих способов
(ключевое слово Class в случае полиморфизма обязтельно брать в скобки):
const [typename T, (Class)] ClassName = new(
{
...
});
const ClassName = new [typename T, (Class)](
{
...
});
const var ClassName = new [typename T, (Class)](
{
...
});
const [typename T, (Class)] ClassName = new [typename T, (Class)](
{
...
});
const [typename T : BaseType, (Class : BaseType2)] ClassName = new(
{
...
});
const ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
...
});
const var ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
...
});
const [typename T : BaseType, (Class : BaseType2)] ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
...
});
Словари от чисел, строк или других типов, кроме typename, пока лучше даже не пытаться создавать -
они не работают!
10. Обработка исключений:
try
{
...
}
catch (ExceptionType var) if (condition) // if, а не when
{
...
}
В текущей версии доступен базовый набор исключений: Exception, ArgumentException (включает в себя ArgumentNullException
и ArgumentOutOfRangeException, хотя явно указать их нельзя), IndexOutOfRangeException, InvalidOperationException,
NullReferenceException и IOException.
11. И самое невероятное - ПАКЕТНЫЙ МЕНЕДЖЕР!!! Вы можете подключить любой пакет,
доступный в публичном репозитории NuGet - достаточно зайти в настройки и указать его имя.
Рабочие примеры кода на C#.NStar, в дополнение к предыдущим версиям:
using System;
using System.Threading;
Class MyClass
{
Constructor()
{
}
int Function Sync()
{
var x = MyClass2.MyFunc(5);
return x;
}
Task[int] Function Async1()
{
var x = MyClass2.MyFunc(5);
return x;
}
Task[int] Function Async2(int n)
{
return n * n;
}
}
static Class MyClass2
{
Func[Task[int], int] MyFunc = new MyClass().Async2;
}
return new MyClass().Async1();
object item = "Welcome!";
if (item is string text)
return text;
abstract Class BaseStack
{
required typename T { get, init };
abstract T Function Peek();
abstract T Function Pop();
abstract null Function Push(T item);
}
const [typename T, (Class : BaseStack[T])] Stack = new(
{
private () T list = new(32);
T Function Peek()
{
return list[^1];
}
T Function Pop
{
return list.GetAndRemove(list.Length - 1);
}
null Function Push(T item)
{
list.Add(item);
}
});
BaseStack[int] intStack = new Stack[int]();
intStack.Push(5);
intStack.Push(10);
var x = (intStack.Pop(), intStack.Peek());
BaseStack[string] stringStack = new Stack[string]();
stringStack.Push("A");
stringStack.Push("B");
var y = (stringStack.Pop(), stringStack.Peek());
return (x, y);
() int list = new();
for (i in Chain(0, 10)) while (i * i % 20 < 10)
{
list.Add(i);
}
return list;
int n = 0;
for (i in 1..1000)
{
n++;
}
return n;
Record Pair(string Name, int Value);
Pair pair = new("Status", 100);
return pair;
const [typename T : IComparable[T], (Class)] Repository = new(
{
private () T items = new();
null Function Add(T item)
{
items.Add(item);
}
T Function GetMax()
{
if (items.Length == 0)
return null;
return Max(items);
}
});
Class Product : IComparable[Product]
{
int Id;
int Function CompareTo(Product product)
{
return Id.CompareTo(product.Id);
}
}
var repo = new Repository[Product]();
repo.Add(new Product[1]());
repo.Add(new Product[5]());
return repo.GetMax().Id;
using System;
using System.IO;
try
{
() int list = (1, 2, 3);
return list.IndexOf(1, 5);
}
catch (ex) if (ex is not ArgumentException)
{
return 1;
}
catch (ex)
{
return "" + ex.Message;
}
return 2;
Все остальное
не проверено и, скорее всего, не
работает
.
Ссылка на EXE (~150 MB)
Скачать из облаков
Назад ко всем версиям